#include <stdio.h>
#include <fcntl.h> 
#include <unistd.h>
#include <termios.h> 
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include "touch.h"
#include "front.h"
//6818串口所对应的文件名
#define COM2 "/dev/ttySAC1"
#define COM3 "/dev/ttySAC2"
#define COM4 "/dev/ttySAC3"

extern int x_read;
extern int y_read;

int data[5] = {0};

//定义命令--->设置模块的工作方式
unsigned char cmd1[3]={0xa5,0x81,0x26};//设置连续光照模式
unsigned char cmd2[3]={0xa5,0x82,0x27};//设置温湿度气压海拔模式
unsigned char cmd3[3]={0xa5,0x83,0x28};//设置两个模式 
/* 设置串口参数（初始化串口） */
void init_tty(int fd)
{    
	//声明设置串口的结构体
	struct termios termios_new;
	//先清空该结构体
	bzero( &termios_new, sizeof(termios_new));
	//	cfmakeraw()设置终端属性，就是设置termios结构中的各个参数。
	cfmakeraw(&termios_new);
	//设置波特率
	//termios_new.c_cflag=(B9600);
	cfsetispeed(&termios_new, B9600);
	cfsetospeed(&termios_new, B9600);
	//CLOCAL和CREAD分别用于本地连接和接受使能，因此，首先要通过位掩码的方式激活这两个选项。    
	termios_new.c_cflag |= CLOCAL | CREAD;
	//通过掩码设置数据位为8位
	termios_new.c_cflag &= ~CSIZE;
	termios_new.c_cflag |= CS8; 
	//设置无奇偶校验
	termios_new.c_cflag &= ~PARENB;
	//一位停止位
	termios_new.c_cflag &= ~CSTOPB;
	tcflush(fd,TCIFLUSH);
	// 可设置接收字符和等待时间，无特殊要求可以将其设置为0
	termios_new.c_cc[VTIME] = 10;
	termios_new.c_cc[VMIN] = 1;
	// 用于清空输入/输出缓冲区
    	tcflush (fd, TCIFLUSH);
	//完成配置后，可以使用以下函数激活串口设置
	if(tcsetattr(fd,TCSANOW,&termios_new) )
		printf("Setting the serial1 failed!\n");

}

//GY39模块
void GY39(int data[], int len)
{
    //1.打开串口
    int ttyfd = open(COM2,O_RDWR);
    if(-1 == ttyfd)
    {
        perror("open ttyfd fail");
        return ;
    }
    //2.初始化串口
	init_tty(ttyfd);
	
    unsigned char rbuf1[9];
    unsigned char rbuf2[15];
    int Lux,T,P,HUM,H;
    int ret = write(ttyfd,cmd1,3);//获取光照强度
    if(ret!=3)
    {
        sleep(1);//等待完全写入 
    }
    ret = read(ttyfd,rbuf1,9);
	if(ret != 9)
	{
		printf("read rbuf1 failed\n");
		return ;
	}
    if(rbuf1[0]==0x5A&&rbuf1[1]==0x5A&&rbuf1[2]==0x15)//判断帧是否正常
    {
        Lux=(rbuf1[4]<<24)|(rbuf1[5]<<16)|(rbuf1[6]<<8)|rbuf1[7];
        Lux=Lux/10;//最后一位不要 不显示小数
        printf("light = %d\n",Lux);
		data[0] = Lux;
    }
	
    //获取气压海拔等....
    //S1 切换模式
    ret = write(ttyfd,cmd2,3);
    if(ret!=3)
    {
        sleep(1);//等待完全写入 
    }

    ret = read(ttyfd,rbuf2,15);
	if(ret != 15)
	{
		printf("read rbuf2 failed\n");
		return ;
	}
    if(rbuf2[0]==0x5A&&rbuf2[1]==0x5A&&rbuf2[2]==0x45)//判断帧是否正常
    {
		//温度
        T=(rbuf2[4]<<8)|rbuf2[5];
        T=T/100;
        printf("T=%d\n",T);
		data[1] = T;
		//气压
		P = (rbuf2[6]<<24)|(rbuf2[7]<<16)|(rbuf2[8]<<8)|rbuf2[9];
		P = P/100;
		printf("P=%d\n",P);
		data[2] = P;
		//湿度
		HUM=(rbuf2[10]<<8)|rbuf2[11];
        HUM=HUM/100;
		printf("HUM=%d\n",HUM);
		data[3] = HUM;
		//海拔
		//printf("%x %x",rbuf2[12], rbuf2[13]);
		H=(rbuf2[12]<<8)|rbuf2[13];
        H=H;
		printf("H=%d\n",H);
		data[4] = H;
    }
    close(ttyfd);
    return ;
}

void sensor()
{
	int x = -1,y = -1;
	int num[5] = {0};
	int i=0;
	
	lcd_draw_rectangel(0, 0, 800, 480, 0xffffff);
	lcd_draw_rectangel(700, 0, 100, 100, 0xffff);
	
	while(1)
	{
		if(x!=x_read||y!=y_read&&x_read!=-1&&y_read!=-1)
		{
			x = x_read;
			y = y_read;
			x_read = -1;
			y_read = -1;
			
		}
		
		for(i=0; i<5; i++)
		{
			if(num[i] != data[i])
			{
				num[i] = data[i];
				lcd_draw_rectangel(0, i*96, 200, 50, 0xffffff-(i+1)*200);
				lcd_draw_digit(num[i],0, i*96, 0xff0000);
				if(i == 0)
					lcd_draw_rectangel(700, 0, 100, 100, 0xffff);
			}
		}
		
		if(x>=700&&x<800 && y<100&&y>=0)
			break;
		x = -1;
		y = -1;
	}
}

